package rauguelu.lectorrss;

import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.xml.sax.Attributes;

import rauguelu.programaEventos.R;

import android.content.res.Resources;
import android.sax.Element;
import android.sax.EndElementListener;
import android.sax.EndTextElementListener;
import android.sax.RootElement;
import android.sax.StartElementListener;
import android.util.Xml;

public class RssParserSax2 {
	
	private URL rssUrl;
    private Noticia noticiaActual;
    
    private InputStream rssIS; // Prueba para probar en el trabajo
    
    public RssParserSax2(String url) {  	
        try {
            this.rssUrl = new URL(url);
        } catch (MalformedURLException e) {
            throw new RuntimeException(e);
        }
    }
    
    // Esto es para probar en el trabajo, que no se por que mi emulador en el eclipse
	// del curro no tiene acceso a internet y peta. Asi que dejalo por ahora
    public RssParserSax2(String url, Resources recursos) {
    	rssIS = recursos.openRawResource(R.raw.europress);
    }
    
    public List<Noticia> parse() {
        final List<Noticia> noticias = new ArrayList<Noticia>();
 
        RootElement root = new RootElement("rss");
        Element channel = root.getChild("channel");
        Element item = channel.getChild("item");
 
        item.setStartElementListener(new StartElementListener(){
            public void start(Attributes attrs) {
                noticiaActual = new Noticia();
            }
        });
 
        item.setEndElementListener(new EndElementListener(){
            public void end() {
                noticias.add(noticiaActual);
            }
        });
 
        item.getChild("title").setEndTextElementListener(new EndTextElementListener(){
	        public void end(String body) {
	            noticiaActual.setTitulo(body);
	        }
        });
 
        item.getChild("link").setEndTextElementListener(new EndTextElementListener(){
            public void end(String body) {
                noticiaActual.setLink(body);
            }
        });
 
        item.getChild("description").setEndTextElementListener(new EndTextElementListener(){
            public void end(String body) {
            	Pattern p = Pattern.compile(".*<img[^>]*src=\"([^\"]*).*>",Pattern.CASE_INSENSITIVE);
            	Matcher m = p.matcher(body.toString());
            	
            	if (m.find()) {
        			noticiaActual.setImagen(m.group(1));
        			body = body.replace(m.group(), "");
        		}
            	
                noticiaActual.setDescripcion(body);
            }
        });
 
        item.getChild("guid").setEndTextElementListener(new EndTextElementListener(){
            public void end(String body) {
                noticiaActual.setGuid(body);
            }
        });
 
        item.getChild("pubDate").setEndTextElementListener(new EndTextElementListener(){
            public void end(String body) {
                noticiaActual.setFecha(body);
            }
        });
 
        try {
        	//Xml.parse(rssIS, Xml.Encoding.UTF_8, root.getContentHandler()); // Trabajo
            Xml.parse(this.getInputStream(), Xml.Encoding.UTF_8, root.getContentHandler());
        } catch (Exception ex) {
            throw new RuntimeException(ex);
        }
 
        return noticias;
    }
 
    private InputStream getInputStream() {
        try {
            return rssUrl.openConnection().getInputStream();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}
